// dataviewjs 代码模板的标准化
// 通过 input 属性来控制笔记的输出格式

/*
```dataviewjs
let input = {
    showTitle : true,   // 是否显示标题
    checkPath:"",  // 检查笔记的路径，如果指定路径的话，则显示这个路径下的笔记，而非当前笔记
    limit: 0,          // 限制显示的笔记数量,0表示不限制
    showFieldDescription : false,  // 是否显示描述
    showFieldTags : false,   // 是否显示标签
    showFieldKeywords : false,   // 是否显示关键字
    showFieldAliases : false,   // 是否显示别名
    showPath : false,   // 是否显示路径
    showSize : false   // 是否显示大小
}
dv.view("obsidian_script/dataview/dv_style1_checkNav", input)
```
*/

let textMap = {
    "title": "在导航中的调用",                      // 笔记的标题
    "noNoteNotice": "在导航中没有被调用"     // 无笔记提示
}

let colors = ["#FFB8EBA6", "#FF5582A6", "#FFB86CA6", "#FFF3A3A6", "#BBFABBA6", "#ABF7F7A6", "#ADCCFFA6", "#D2B3FFA6", "#CACFD9A6"]

/**
 * 返回的是 TNote 列表对象
 * @returns {TNote[]}
*/
function QueryNote() {
    // 检查当前笔记引用其他笔记的情况
    let curNote = dv.current();
    if (input.checkPath && input.checkPath.length > 0) {
        curNote = dv.page(input.checkPath);
    }
    let notes = [];
    curNote.file.inlinks.forEach(function (link) {
        if(link.path.includes("02导航")){
            let note = dv.page(link.path);
            notes.push(note);
        }
    })
    return notes;
}

/**
 * 添加需要特别显示的属性字段，一般为组合型的字段
 * @param {TNote} note 当前笔记对象
 * @param {string[]} headers 标题列表
 * @param {string[]} item 当前笔记的内容
 * @param {boolean} bFirstHeader 是否已经添加标题了
*/
function AddSpecialField(note, headers, item, bFirstHeader){
    // let frontmatter = note.file.frontmatter;

    // if (bFirstHeader) {
    //     headers.push("新的标题");
    // }
    
    // item.push(frontmatter.description);
}
// let index = Math.floor(Math.random() * colors.length)
// `<mark style="background: ${colors[index]}; color: #000;">${content}</mark>`

//////////////////////////////////////////
/////   以下为模板代码，一般不需要修改  /////
//////////////////////////////////////////

let headers = []   // 存储标题列表
let values = []    // 存储标题下的内容
let bFirstHeader = true;

let keywordColor = {}
let tagColor = {}
let aliasColor = {}

if(!input)
    input = {};
else if (typeof input != "object")
    input = {};

if (input.showTitle)
    dv.header(4, textMap.title)
/**
 * 添加需要特别显示的属性字段
 * @param {TNote} note 当前笔记对象
 * @param {string[]} headers 标题列表
 * @param {string[]} item 当前笔记的内容
*/
function AddShowField(note, headers, item){
    let frontmatter = note.file.frontmatter;
    // 需要显示的字段：description
    if (input.showFieldDescription) {
        if (bFirstHeader) {
            headers.push("说明");
        }
        if (frontmatter.description) {
            item.push(frontmatter.description);
        }
        else {
            item.push("-");
        }
    }
    // 需要显示的字段：tags
    if (input.showFieldTags) {
        if (bFirstHeader) {
            headers.push("标签");
        }
        if (frontmatter.tags) {
            let tags = frontmatter.tags.map((tag) => {
                if(!tagColor[tag]){
                    tagColor[tag] = Math.floor(Math.random() * colors.length)
                }
                let index = tagColor[tag]
                return `<mark style="background: ${colors[index]}; color: #000;">${tag}</mark>`
            })
            let tagstr = tags.join(",");
            item.push(tagstr);
        }
        else {
            item.push("-");
        }
    }
    // 需要显示的字段：keywords
    if (input.showFieldKeywords) {
        if (bFirstHeader) {
            headers.push("关键字");
        }
        if (frontmatter.keywords) {
            let keywords = frontmatter.keywords.map((keyword) => {
                if(!keywordColor[keyword]){
                    keywordColor[keyword] = Math.floor(Math.random() * colors.length)   
                }
                let index = keywordColor[keyword]
                return `<mark style="background: ${colors[index]}; color: #000;">${keyword}</mark>`
            })
            let keywordstr = keywords.join(",");
            item.push(keywordstr);
        }
        else {
            item.push("-");
        }
    }
    // 需要显示的字段：aliases
    if (input.showFieldAliases) {
        if (bFirstHeader) {
            headers.push("别名");
        }
        if (frontmatter.aliases) {
            let aliases = frontmatter.aliases.map((alias) => {
                if(!aliasColor[alias]){
                    aliasColor[alias] = Math.floor(Math.random() * colors.length)
                }
                let index = aliasColor[alias]
                return `<mark style="background: ${colors[index]}; color: #000;">${alias}</mark>`
            })
            let aliasestr = aliases.join(",");
            item.push(aliasestr);
        }
        else {
            item.push("-");
        }
    }
    // 需要显示的字段：path
    if (input.showPath) {
        if (bFirstHeader) {
            headers.push("笔记位置");
        }
        item.push(note.file.path);
    }
    // 需要显示的字段：size
    if (input.showSize) {
        if (bFirstHeader) {
            headers.push("大小");
        }
        item.push(note.file.size);
    }
}

let notes = QueryNote();

// limit 数量限制
if (input.limit > 0)
    notes = notes.slice(0, input.limit);

if (notes.length > 0) {
    notes.forEach(function (note) {
        console.log(`笔记内容 ${note}`);
        let item = []
        // 笔记名
        if (bFirstHeader) {
            headers.push("笔记名");
        }
        item.push(note.file.link);

        // 需要特别显示的内容
        AddSpecialField(note, headers, item, bFirstHeader)

        AddShowField(note, headers, item)
        values.push(item);
        bFirstHeader = false;
    })
    if(headers.length > 1)
        dv.table(headers, values);
    else{
        let newValues = [];
        values.forEach(function (item) {
            newValues.push(item[0]);
        })
        dv.list(newValues);
    }
}
else {
    dv.paragraph(textMap.noNoteNotice);
}
